Updating to Geneva release 003 (1.02): ------------------------------------- To update to the new version, follow these steps: 1. If you intend to keep the old version around for some reason, be sure to make a backup of all files. 2. Make a backup of your original Geneva disk! 3. Run the enclosed patch program, PATCH003.PRG. 4. After the patch has successfully completed, run the INSTALL.PRG on the modified disk. It will re-install all of the new files. If you get error message saying that the file already exists, just let the program overwrite the old files. If you have problems with the patch ----------------------------------- If, for some reason, the patch program does not run properly you can send your original Geneva disk back to us along with a check for $5 + $2 to cover return shipping. We will rewrite the disk with the most recent version for you and return it to you by mail. Send to: Gribnif Software P.O. Box 779 Northampton, MA 01061 Files affected -------------- INSTALL.SCR INSTALL.PRG TASKMAN\TASKMAN.ACC TASKMAN.RSC GENEVA\GENEVA.PRG GENEVA.CNF HELP\GNVAHELP.PRG GENEVA.HLP TASKMAN.HLP PROGRAM\GNVA_DB.PRG NEW_AES.H NEW_GEM.LIB XWIND.H XWINDGFA.SFX * TASKMAN\TASKMAN.C TASKMAN.H TASKMAN.HRD * To extract XWINDGFA.LST, copy it to another disk and change its name to XWINDGFA.TOS. Then, run this program and the file will self-extract. Geneva Revision Notes 12/31/93 Notes: If you want to use That's Write's desk accessories with it, you will have to set That's Write to be single-tasking. This is due to a shortcoming in the method that desk accessories use to communicate with That's Write. Newer versions of the That's Write desk accessories will address this problem. Page Assistant's Index dialog will show some underlines in places where they should not be. This can only be avoided by turning the "Auto keyboard equivs" option off for the program. This is true as of version 2.05. Changes since 9/29/93: --------------------- INSTALL: INSTALL.SCR will now allow you to set the parameters for SETMOUSE. INSTALL.PRG will no longer have redraw errors when run under Geneva. TASKMAN: Added a new Misc. Option to allow the video resolution in GENEVA.CNF to be ignored, in favor of the one in NEWDESK/DESKTOP.INF. This means that you can continue to use a boot manager like XBoot to choose video resolutions using the same method you always used. The main window can now be "iconized" by clicking on the "delta" gadget. This shrinks any open windows to a single "icon" window. Double-clicking on the icon window's contents will reopen the Task Manager. The Window Options dialog now accepts any Speedo GDOS font, and any other monospaced GDOS (bitmaped or scalable) font which has all 255 characters. This font is used when drawing menu bars, windows and dialogs. There are a few restrictions, though: o If you use Speedo GDOS, it must be version 4.11 or newer. o When using a Speedo font, Geneva attempts to remap the characters used in window gadgets (like the Full box, the Close box, etc.) While this remapping does work with most Speedo fonts, some fonts (like the Monospace 821 font) do not have the characters in the right locations for this translation, and incorrect characters will appear in the gadgets when they are drawn. This is unavoidable. o Speedo GDOS does not do a very good job of supporting the italics and bold special effects which are found in some of Geneva's dialogs. o Bitmapped fonts can be used, with the same limitations as before. They can even be used with Speedo GDOS. The Task Manager now uses a more exact method for drawing the contents of the Sample Window in the Window Options dialog. The current window gadget colors are also used. The objects which make up the Sample dialog in the Dialog Options dialog can be clicked on in order to switch object types. The Outer Box in the Dialog Options sample is now always drawn correctly. GENEVA: The version number and date are now displayed when Geneva runs from the AUTO folder. The icons in alerts will be colored if there are at least 16 colors available in the current video mode. Item selector: If the path is very long, only the first 10 characters of the template will be shown when the path gets updated. This way you can always see at least the last 16 chars of the full path. You can now press [Alt][\] to move to the root directory in the item selector. Using GDOS fonts within TEDINFO objects is now supported, as in AES 4.1. Note that if you click on an editable field containing a GDOS font with the mouse, the edit cursor will always be positioned to the end of the field. Actually positioning to the character under the mouse would be too computationally intensive. Added a new type of wildcard to the item selector. The ! can be used for inversion ("not") of the next item in a string. If the next item is just a regular character, then that one letter will be inverted; if the next item is a {} or [] bracketed expression, then the meaning of that expression will be inverted. Examples: *.prg Ending in PRG *.!abc *.?BC, excluding *.ABC *.ab!c *.AB?, excluding *.ABC *.!a!bc *.??C, excluding *.ABC [a-d]*.* Starting with A, B, C, or D ![a-d]*.* Anything not starting with A, B, C, or D *.{prg,prx} Ending in PRG or PRX *.!{prg,prx} Anything not ending in PRG or PRX Any number of !'s can be used within a wildcard. The effect is that the expressions are negatively added together. For example: !{stalker,neodesk?}.!{ac[cx],rsc} Matches anything but: stalker.acc stalker.acx stalker.rsc neodesk?.acc neodesk?.acx neodesk?.rsc However, NEODESK.ACC will match, since it does not have a character between the "k" and the period. The ! can be used in the main item selector path, and also in the Find dialog. Added a new flag to allow the video resolution in GENEVA.CNF to be ignored, in favor of the one in NEWDESK/DESKTOP.INF. A program flag has been added for GENEVA. This allows you to change the name of the Geneva Manager in the Desk menu (and also its Activation key) by using the Task Manager. Other changes in Geneva: Fixed a typo that prevented the use of multiple [] or {} bracketed expressions in a wildcard. Using function keys to access the paths in item selector works again. Fixed a problem which caused characters to disappear in editable fields which were created with the WERCS resource contruction program. Geneva now works correctly when: o Run on a Moniterm card while a color monitor or no monitor at all is plugged into the Atari video port. o Using Crazy Dots board running NVDI in 2-color mode. o Using a GENEVA.CNF file which was saved while using a TTM195 monitor with another resolution. (I could not test this one) Added a check to avoid a bug in TOS 2.01-2.05 which sometimes causes a monochrome screen to "wrap around" several pixels. Fixed the GEM.CNF "run" command to correctly pass parameters to the program to be run. Fixed a typo that prevented the windows in GNVAHELP and GNVA_TOS from scrolling quickly when the scroll bar was dragged. Atari-style 3D buttons are now drawn much more like the way AES 4.0 does. Furthermore, objc_find() takes an OUTLINED attribute into account for background objects. Fixed wind_get( X_WF_xSPLIT. Setting a new window split location with wind_set( X_WF_xSPLIT now causes a redraw of the window areas. A horizontally split window will now always at least have an empty vertical scroll bar. The same goes for a vertical split/horiz scroll. Fixed wind_calc() with HSLIDE, LFARROW, RTARROW, VSLIDE and nothing else. In release 002, Geneva would try to keep track of how many times an application had turned the mouse on or off, and then take this into account when making a different application the foreground one. This cannot always work because of screen acceleration programs, and has therefore been removed. Clicking on the small text in the item selector's Find dialog will no longer cause a crash. Also, the "Find Next" button will not sometimes remain selected when it should not. Multi-color icons work again. appl_read() again works correctly when reading more than 16 bytes. This used to cause the Miscellaneous Options help to crash. The name and serial number are centered in About Geneva. Double-clicking on the move box of an alert or the About Geneva dialog will now work correctly. Added a hack to avoid a bug in the Falcon TOS that would cause some programs to think that the wrong system font was being used. The Applications list should no longer lockup unexpectedly. Sub-submenus are now always positioned correctly. The bottom line of popup menu will always be drawn correctly. Added a check to avoid an error made by at least one program: passing an mn_scroll=1 value to menu_popup() when 1 is not a child of the parent scroll box will no longer cause a crash. Moving the mouse rapidly from a pulldown menu to a submenu will no longer result in the submenu disappearing if the mouse happens to pass over another menu entry. The menu display delay is used for this. The event_multi() mode X_MU_DIALOG can now be used at the same time as MU_BUTTON and/or MU_KEYBD. If another program uses the exec_os variable and obeys the XBRA protocol, Geneva will not complain that it cannot install itself. When a program redefines the tree of the desktop and uses G_USERDEF objects in the tree, strange results will no longer occur if the program quits without first unsetting the new desktop. (INSHAPE) When copying in the item selector, using the OK button when a filename conflict occurs will always result in an overwrite of the old file. Previously, this would only sometimes happen. Also, the file count is always displayed, and is updated properly when Skipping a conflict. Furthermore, you can press the OK button when a folder conflict occurs, in order to use the existing folder. Programs which use GEMDOS text output (and other GEMDOS-level standard file handle operations) will now work on the Falcon with TOS versions 4.00-4.04. (Technically speaking, these versions of TOS do not copy the standard file handles of the parent process to the child when a Pexec(5) is performed.) An incompatibility with TOS 4.00-4.04 which would result in the inability to run any more programs, after a large number had been run, has been fixed. This tended to show up mostly when changing resolutions. If a program requests an event of zero mouse clicks, it no longer gets a return value of one, it gets zero. The About Geneva dialog is now more resolution/font size independent. Now works completely with the Screenblaster. When you tell Geneva to change resolutions, you also get the Screenblaster video resolution menu. Fixed objc_find() and mouse rectangle events so that they no longer consider a pixel one past the lower right or bottom edge. A program's message buffer is no longer modified if it does not receive any message events. (PAGEASIT) The objc_draw() call will correctly affect clipping if either the width or the height of the rectangle passed to the function is zero. Previously, there was a chance this would not happen. (PAGEASIT) If a program asks for mouse events with 0 clicks, the report it gets from Geneva when the mouse is clicked will have the number of clicks set to 0. Popup menus created with menu_popup() can now have submenus. Also, put a check in to prevent selecting a disabled submenu starter. (STFAX) Fixed a bug in the assignment of automatic keyboard equivalents. Now, exit buttons are always scanned first, as they should be. wind_get( WF_OWNER ) now correctly reports the handles of the next and previous windows in the stack. The width of the MOVER bar in a window with a SMALLER gadget is now correct. An object with the extended type X_HELP is no longer considered for an automatic keyboard equivalent. Programs which incorrectly assume that their own application ID is always 0 will work correctly if using appl_write() to send a message to themselves, even in multitasking mode (assuming there is no single-tasking application in memory, since it would have ID 0 and therefore get the message; the best solution for this problem is simply to run the offending program in single-tasking mode at all times). (STDCAT) appl_getinfo(0) and (1) now return the point size (rather than the pixel height) of the fonts. Modes (11) through (14) are now also supported. Also in the item selector: when it is first called, the number of items and bytes in the current directory are now always displayed. If a program changes the clipping array of Geneva's VDI handle, this will no longer cause redraws to fail unexpectedly later on. (some very bad programming in TWRITE3). It is now possible to change the size and position of a window which has been created but not opened, by using wind_set(WF_CURRXYWH). This just makes it easier to use windowed dialogs. Having the Limit window handles option on for a program which uses Geneva's dialogs within windows (like TASKMAN) will work properly. Made a few changes which allow running a program within another program by way of Pexec() to work better. (SBPRO,1ST_WORD,QWK) The version reported in the Gnva cookie really is correct now. Window colors are now set for a window whose tree is redefined with x_wind_tree(). If a program (incorrectly) uses evnt_button() with a mask of 1 and a state of 2, Geneva will no longer lock up. (DATMAN) The state is now always internally AND'ed with the mask. Fixed a bug which would sometimes cause a crash when a program tried to open a new VDI workstation and failed. (WORKS) Programming additions: --------------------- wind_get() modes X_WF_HSPLIT (0x1700) & X_WF_VSPLIT (0x1800) The manual does not document the parameters returned by this call, and it differs from what is passed in the equivalent wind_set(). wi_gw1: Split bar position wi_gw2: Size, in pixels, of the upper (or left) window region wi_gw3: Size of the lower (or right) window region evnt_mesag() return X_WM_OBJECT (0xE900) This message type is returned to an application when it uses wind_set() mode X_WF_OBJHAND to affect the manner in which window gadgets are handled. If an application receives this message, it is because the object tree handler routine instructed Geneva not to process the mouse click on a window gadget as a normal event. Instead, a special message is returned to the application: Word 0: 0xE900 Word 1: Application ID Word 2: 0 Word 3: Handle of the window containing the object Word 4: Object tree index of the object which was clicked Note that in order for Geneva to determine that the mouse has been clicked on an object in a window's tree structure, it must be of type EXIT or TOUCHEXIT. Geneva's default window gadgets already have these attributes set correctly. See also: wind_set() mode X_WF_OBJHAND. wind_get()/wind_set() mode X_WF_OBJHAND (0x1F00) When an application wants to intercept some or all of the button events that would otherwise be interpreted as Geneva to mean that a window gadget has been clicked on, this wind_set() mode can be used to provide Geneva with the address of a routine which instructs Geneva to either ignore the event, or to process it as normal. This allows the programmer to redefine the operation of window gadgets, and to define his own actions for new gadgets which have been added with the x_wind_tree() function. The routine is passed the handle of the window containing the object and the index of the object within the window's object tree. If the user routine returns a 0, then Geneva will generate an X_WM_OBJECT message and send it to the application. If the routine returns a 1, then Geneva will process the action as a normal event and act accordingly. IMPORTANT: The application's object handler routine must not use any AES functions. The following example declares an object handler which allows the action of the vertical scroll bar to be redefined: /* change this to "int cdecl objhand..." for Pure C */ int objhand( int handle, int obj ) { /* handle parameter is not used */ if( obj==WGVSMLSL ) return 0; /* this is the vertical slider */ return 1; /* otherwise, process as normal */ } main() { int handle, message[8]; handle = wind_create( NAME|MOVER|VSLIDE|UPARROW|DNARROW, 50, 50, 150, 150 ); if( handle > 0 ) { wind_set( handle, X_WF_OBJHAND, &objhand ); wind_open( handle, 50, 50, 150, 150 ); } ... evnt_mesag( message ); switch( message[0] ) { case X_WM_OBJECT: if( message[3]==handle && message[4]==WGVSMLSL ) /* do something new with the slider */ } } If wind_set( X_WF_OBJHAND ) is passed a NULL pointer, instead of a pointer to a function, object handling is discontinued for that window. Note that in order for Geneva to determine that the mouse has been clicked on an object in a window's tree structure, it must be of type EXIT or TOUCHEXIT. Geneva's default window gadgets already have these attributes set correctly. wind_get() can also be used to get a pointer to the current object handler routine. A NULL pointer means that there is no object handler defined. wind_get()/wind_set() mode X_WF_DIALEDIT (0x2000) When a windowed dialog has been defined with wind_set() mode X_WF_DIALOG, these two options can be used to get or set the index of the object which currently has the edit cursor. This can be helpful when an application changes the contents of a text field while the dialog is still displayed, or when it needs to hide the object that currently has the edit cursor. wind_get( X_WF_DIALEDIT ) will return the index of the object which currently has the edit cursor in the "wi_gw1" parameter, and the position of the edit cursor within the object's text in the "wi_gw2" parameter. wind_set( X_WF_DIALEDIT ) changes the object ("wi_sw1") and the edit index ("wi_sw2"). If the object is 0, then the edit cursor will simply be turned off; otherwise it will be moved to the new object. If the index is 0, the cursor will be positioned before the leftmost character in the field; if it is a number > 0, it will be further to the right. If the index is -1, then the cursor will be automatically moved to the rightmost position. New extended OBJECT types X_USRDEFPRE (90) and X_USRDEFPOST (91) It is sometimes desirable to change the appearence of an object slightly, but using a G_USERDEF object would necessitate putting a lot of extra code into the user routine, since a G_USERDEF object cannot have any text, fill, or border. They have to be drawn by the user routine, or not at all. Geneva provides two new extended object types which allow an object to be modified or have its appearence altered, while still having the same opportunity to be drawn like a normal object. If bits 12-15 of an object's ob_state are 9 ((ob_state&X_MAGMASK)==X_MAGIC) and the high byte of the ob_type is either 90 (X_USRDEFPRE) or 91 (X_USRDEFPOST), then the ob_spec of the object is assumed to contain a pointer to a USERBLK structure. This is much like a normal G_USERDEF object, except that the ub_parm member of the USERBLK structure must contain the value which would have been in ob_spec if the object was not a G_USERDEF. Since this may sound a little confusing, the following example can be used. It defines a G_BOXCHAR object which has its character increased by 1 every time the object is drawn: /* contains the code which increments the character and the old ob_spec value */ USERBLK user; /* start with a G_BOXCHAR object, with the character '1', black border of thickness of 2, black text, patterned */ OBJECT ob = { -1, -1, -1, G_BOXCHAR, 0, 0, ((long)'1'<<24)|(2L<<16)|(1<<12)|(1<<8)|(2<<4)|1, 50, 50, 25, 25 }; int cdecl inc_char( PARMBLK *p ) { char c; /* extract the character, which is in the MSB of the ub_parm element of "user" */ c = ((user.ub_parm>>24) & 0xFF) + 1; /* now put it back */ user.ub_code = (c<<24L) | (user.ub_parm & 0xFFFFFFL); /* return the current state */ return p->pb_currstate; } void draw_it(void) { objc_draw( &ob, 0, 0, 50, 50, 25, 25 ); /* draw */ Bconin(2); /* wait for keypress */ } main() { /* start by drawing the object normally */ draw_it(); /* now, set up the USERBLK */ user.ub_code = &inc_char; /* function */ user.ub_parm = ob.ob_spec; /* old ob_spec of object */ ob.ob_type |= X_USRDEFPRE<<8 /* extended ob_type */ ob.ob_state |= X_MAGIC; /* set magic number */ ob.ob_spec.userblk = &user; /* set ob_spec */ /* now, draw it a few times and watch the number go up */ draw_it(); draw_it(); draw_it(); draw_it(); } An X_USRDEFPRE function is called before the object is drawn. In contrast, an X_USRDEFPOST function is called after the object's contents have been drawn, but before any ob_state effects are processed.